package com.zhanghe.study.java8.lambda;

import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Supplier;

/**
 * 方法引用
 * 如果lambda体的内容有方法已经实现了，可以使用方法引用
 *
 * 三种语法格式
 * 1、对象::实例方法
 * 2、类::静态方法
 * 3、类::实例方法  当lambda表达式第一个参数是实例方法的调用者，第二个参数是实例方法的参数时，可以使用
 */
public class TestMethodRef {

    /**
     * 对象::实例方法
     */
    public static void test1(){
        Consumer<String> con =  System.out::println;
        con.accept("aaaa");

    }

    /**
     * 类::静态方法
     */
    public static void test2(){
        Consumer<String> con =  TestMethodRef::testStatic;
        con.accept("xxxx");
    }

    /**
     * 类::实例方法
     */
    public static void test3(){
        MyTest myTest = String::equals;
    }

    /**
     * 测试无参构造器
     * @return
     */
    public static TestMethodRef test4(){
        Supplier<TestMethodRef> supplier = TestMethodRef::new;
        return supplier.get();
    }

    /**
     * 测试有参构造器
     * @return
     */
    public static TestMethodRef test5(){
        Function<Integer,TestMethodRef> function = TestMethodRef::new;
        return function.apply(10);
    }

    public TestMethodRef(){
        System.out.println("无参构造器调用");
    }

    private int x;
    public TestMethodRef(int x){
        this.x = x;
    }



    public static void main(String[] args) {
        test1();
        test2();
        test3();
        test4();
        TestMethodRef t = test5();
        System.out.println(t.x);
    }

    public static void testStatic(String x){
        System.out.println("我输出入了"+x);
    }


}

@FunctionalInterface
interface MyTest{
    boolean test(String x,String y);
}
